home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1993-10-06 | 5.5 KB | 109 lines |
- DEFINITION MODULE MEMBLK;
- __DEF_SWITCHES__
- #ifdef HM2
- #ifdef __LONG_WHOLE__
- (*$!i+: Modul muss mit $i- uebersetzt werden! *)
- (*$!w+: Modul muss mit $w- uebersetzt werden! *)
- #else
- (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
- (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
- #endif
- #endif
- (*****************************************************************************)
- (* (effiziente) Operationen auf typenlosen Speicherbereichen. *)
- (* Dies sind Ansi-C-Funktionen, bis auf "memswap()" und "*alloc()". *)
- (* "memmove()" und "memset()" liefern allerdings nicht die Adresse des Ziel- *)
- (* strings als Funktionswert. *)
- (* --------------------------------------------------------------------------*)
- (* 28-Sep-93, Holger Kleinschmidt *)
- (*****************************************************************************)
-
- FROM SYSTEM IMPORT
- (* TYPE *) ADDRESS;
-
- FROM types IMPORT
- (* TYPE *) sizeT;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- PROCEDURE memmove ((* EIN/ -- *) dst : ADDRESS;
- (* EIN/ -- *) src : ADDRESS;
- (* EIN/ -- *) len : sizeT );
-
- (*--------------------------------------------------------------------------
- | Kopiert <len> Bytes von <src> nach <dst>. Die Bereiche duerfen sich |
- | ueberlappen. Wenn beide Adressen gerade oder ungerade sind, wird beson- |
- | ders schnell kopiert. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE memset ((* EIN/ -- *) dst : ADDRESS;
- (* EIN/ -- *) val : CARDINAL;
- (* EIN/ -- *) len : sizeT );
-
- (*--------------------------------------------------------------------------
- | Setzt <len> Bytes ab Adresse <dst> auf <val>. Der Wert in <val> wird |
- | modulo 256 genommen, d.h. es zaehlt nur das untere Byte. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE memchr ((* EIN/ -- *) src : ADDRESS;
- (* EIN/ -- *) val : CARDINAL;
- (* EIN/ -- *) len : sizeT ): ADDRESS;
-
- (*--------------------------------------------------------------------------
- | Liefert einen Zeiger auf das erste Byte mit dem Wert <val> modulo 256, |
- | das in den ersten <len> Bytes ab <src> vorkommt, oder NULL, falls ein |
- | solcher Wert nicht vorkommt. |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE memcmp ((* EIN/ -- *) blk1 : ADDRESS;
- (* EIN/ -- *) blk2 : ADDRESS;
- (* EIN/ -- *) len : sizeT ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | Vergleicht <len> Bytes ab den Adressen <blk1> und <blk2> miteinander. |
- | Falls alle Bytes gleich sind, wird Null zurueckgeliefert, falls ein Byte |
- | in <blk>^ kleiner als in <blk2>^ ist, wird ein Wert kleiner Null zurueck-|
- | geliefert, falls ein Byte gresser ist, wird ein Wert groesser Null zu- |
- | rueckgeliefert. |
- --------------------------------------------------------------------------*)
-
-
- (* Nicht Ansi-C: *)
- PROCEDURE memswap ((* EIN/ -- *) blk1 : ADDRESS;
- (* EIN/ -- *) blk2 : ADDRESS;
- (* EIN/ -- *) len : sizeT );
-
- (*--------------------------------------------------------------------------
- | Tauscht <len> Bytes ab Adresse <blk1> bzw. <blk2> gegeneinander aus. |
- | Die Speicherbereiche duerfen sich nicht ueberlappen. |
- --------------------------------------------------------------------------*)
-
- (* Nicht Ansi-C: *)
- PROCEDURE memalloc ((* EIN/ -- *) size : sizeT;
- (* -- /AUS *) VAR old : ADDRESS;
- (* -- /AUS *) VAR adr : ADDRESS );
-
- PROCEDURE memdealloc ((* EIN/ -- *) old : ADDRESS );
-
- (*--------------------------------------------------------------------------
- | Mit "memalloc()" wird Speicherplatz auf dem Stack reserviert, der durch |
- | "memdealloc()" wieder freigegeben wird. |
- | <old> ist der Wert des Stackpointers vor Aufruf der Funktion. Dieser Wert|
- | wird bei "memdealloc()" angegeben, um den Stackpointer wieder zurueckzu- |
- | setzen. Wenn mehrere Male "memalloc()" hintereinander aufgerufen wird, |
- | reicht es, sich den Wert des Stackpointers vor dem ersten der Aufrufe zu |
- | merken, und nur einmal "memdealloc()" mit diesem Wert aufzurufen. |
- | <adr> ist der neue Wert des Stackpointers und dient gleichzeitig als |
- | Anfangsadresse des freien Speichers, der <size> Bytes Platz bietet. |
- | "memalloc()" entspricht ungefaehr dem ``C''-alloca, nur wird zusaetzlich |
- | der alte Stackpointer zurueckgeliefert. "memdealloc()" entspricht dem |
- | ``C''-setstack. Die Aufteilung in zwei Funktionen gegenueber der alleini-|
- | gen Verwendung von 'alloca' in ``C'' ist notwendig, da die meisten M2- |
- | Compiler ihre Register NACH dem LINK retten und VOR dem UNLK zurueck- |
- | schreiben, weshalb der Stackpointer am Ende der Funktion den Wert nach |
- | dem Registerretten haben muss. |
- --------------------------------------------------------------------------*)
-
- END MEMBLK.
-